#include "Widget.h"
#include "Scene.h"
#include "Rect.h"

using namespace game_engine;
using namespace game_engine::gui;
using namespace game_engine::components;
using namespace game_engine::utils;

///////////////////////////////////////////////////////////////////////////////
// Constructors and Destructors
///////////////////////////////////////////////////////////////////////////////

Widget::Widget(void)
    : GameObject(), _enabled(true), _focus(false), _height(0.0f), _size(), 
    _visible(true), _width(0.0f), _transformation()
{
}

Widget::Widget(Scene *scene, const string &name, const string &tag, const DrawLevelType drawLevel)
    : GameObject(scene, name, tag, drawLevel), _enabled(true), _focus(false), 
    _height(0.0f), _size(), _visible(true), _width(0.0f)
{
    _transformation = new Transformation(this, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
    addComponent(_transformation);
}

Widget::~Widget(void)
{
}

///////////////////////////////////////////////////////////////////////////////
// Other public methods
///////////////////////////////////////////////////////////////////////////////

const BOOL Widget::isMouseOver(const Point &position) const
{
    BOOL isOver = false;

    // Build temporary rectangle
    Rect btn(_transformation->getXPosition(), _transformation->getYPosition(), 
        _size.getHeight(), _size.getWidth());
    if (btn.isPointWithin(position))
    {
        isOver = true;
    }

    return isOver;
}

///////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////

const BOOL Widget::hasFocus(void) const
{
    return _focus;
}

const FLOAT32 Widget::height(void) const
{
    return _height;
}

const BOOL Widget::isEnabled(void) const
{
    return _enabled;
}

const BOOL Widget::isVisible(void) const
{
    return _visible;
}

const Point Widget::position(void) const
{
    return _transformation->getPosition();
}

const Size& Widget::size(void) const
{
    return _size;
}

const FLOAT32 Widget::width(void) const
{
    return _width;
}

///////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////

void Widget::setEnabled(const BOOL enabled)
{
    _enabled = enabled;
}

void Widget::setFocus(const BOOL focus)
{
    _focus = focus;
}

void Widget::setHeight(const FLOAT32 height)
{
    _height = height;
    _size.setHeight(height);
}

void Widget::setPosition(const Point &position)
{
    _transformation->setPosition(position);
}

void Widget::setSize(const Size &size)
{
    _size = size;
    _height = size.getHeight();
    _width = size.getWidth();
}

void Widget::setVisible(const BOOL visible)
{
    _visible = visible;
}

void Widget::setWidth(const FLOAT32 width)
{
    _width = width;
    _size.setWidth(width);
}
